<?php
/**
 * APP应用基础Model,继承自Model
 * 所有应用Model应继承自此Model,用于以后扩展公用方法
 * @author SongKejing 2012.12.26
 * @todo 扩展公用方法
 */
class BaseModel extends Model{
	
	//数据操作改变的行数
	private $DBChangedNum=0;
	//重新定义Model->autoCheckFields,关闭自动检测数据表字段信息
	protected $autoCheckFields = FALSE;
	
	/**
	 * 
	 * @todo 数据库执行语句before操作，比如更改数据库等
	 */
	private function beforeDBOperat(){
		return;
	}
	
	/**
	 * 
	 * @todo 数据库执行语句after操作，比如删除缓存等
	 */
	private function afterDBOperat(){
		return;
	}
	
	/**
	 * 数据库执行语句
	 * @param string $sql
	 * @todo 数据库分库分表扩展
	 * @return mixed
	 */
	protected function DBQuery($sql){
		$this->beforeDBOperat();			
		$result = $this->query($sql);
		$this->afterDBOperat();
		return $result;
	}
	
	/**
	 * 数据库执行语句
	 * @param string $sql
	 * @return false or integer
	 */
	protected function DBExecute($sql){
		$this->beforeDBOperat();
		$result = $this->execute($sql);
		$this->afterDBOperat();
		if($result===FALSE){
			return FALSE;
		}else{
			$this->DBChangedNum = $result;
			return TRUE;
		}
	}
	
	/**
	 * 数据库SELECT
	 * @param string $sql
	 * @return mixed
	 */
	protected function DBSelect($sql){
		return $this->DBQuery($sql);
	}
	
	/**
	 * 数据库DELETE
	 * @param string $sql
	 * @return false or integer
	 */
	protected function DBDelete($sql){
		return $this->DBExecute($sql);
	}
	
	/**
	 * 数据库INSERT
	 * @param string $sql
	 * @return false or integer
	 */
	protected function DBInsert($sql){
		return $this->DBExecute($sql);
	}
	
	/**
	 * 数据库UPDATE
	 * @param string $sql
	 * @return false or integer
	 */
	protected function DBUpdate($sql){
		return $this->DBExecute($sql);
	}
	
	/**
	 * 获取数据操作影响的行数
	 */
	protected function getChangedNum(){
		return $this->DBChangedNum;
	}
	
	/**
	 * 
	 * @todo 更改数据库连接
	 * @return boolean
	 */
	protected function changeDB(){
		return;
	}
	
	/**
	 * 获取应用分表表名
	 * @param int $uid
	 * @param string $tableName
	 * @todo 分表规则
	 * @return string
	 */
	protected function getAppPatitionTableName($uid, $tableName){
		return $tableName;
	}
	
	protected function sendEmail(){
		
	}
	
	/**
	 * 加密解密函数
	 * @param string $string 加密字符串
	 * @param string $operation DECODE/解密，ENCODE/加密（默认） 
	 * @param string $key 加密密钥
	 * @param int $expiry 加密失效时间
	 * @return 成功返回string，失败返回''
	 */
	public function skjAuthcode($string, $operation = 'DECODE', $key = 'WHO_AM_I', $expiry = 0){ 
	    $ckey_length = 4;
	    $key = md5($key); 
	    $keya = md5(substr($key, 0, 16)); 
	    $keyb = md5(substr($key, 16, 16)); 
	    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): 
	    substr(md5(microtime()), -$ckey_length)) : ''; 
	    $cryptkey = $keya.md5($keya.$keyc); 
	    $key_length = strlen($cryptkey); 
	    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : 
	    sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; 
	    $string_length = strlen($string); 
	    $result = ''; 
	    $box = range(0, 511); 
	    $rndkey = array(); 
	    for($i = 0; $i <= 511; $i++) { 
	        $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
	    }  
	    for($j = $i = 0; $i < 512; $i++) { 
	        $j = ($j + $box[$i] + $rndkey[$i]) % 512; 
	        $tmp = $box[$i]; 
	        $box[$i] = $box[$j]; 
	        $box[$j] = $tmp; 
	    }  
	    for($a = $j = $i = 0; $i < $string_length; $i++) { 
	        $a = ($a + 1) % 512; 
	        $j = ($j + $box[$a]) % 512; 
	        $tmp = $box[$a]; 
	        $box[$a] = $box[$j]; 
	        $box[$j] = $tmp;  
	        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 512])); 
	    } 
	    if($operation == 'DECODE') { 
	        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && 
	            substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
	            return substr($result, 26); 
	        } else { 
	            return ''; 
	        } 
	    } else { 
	        return $keyc.str_replace('=', '', base64_encode($result)); 
	    } 
	}
	
	/**
	 * 发送短信
	 * @param string $sPhoneNum 手机号码
	 * @param string $sContent 短信内容，最大长度70字符
	 * @return TRUE/FALSE
	 * @todo 发送功能待实现，发送失败记录日志等
	 */
	protected function sendSMS($sPhoneNum, $sContent){
		//如果短信内容超过70字符，返回错误代码
		if(mb_strlen($sContent, 'UTF8')>70){
			return 255;
		}
		
		$sContent = urlencode($sContent);
		$sUrl = 'http://gateway.woxp.cn:6630/utf8/web_api/?x_eid=11401&x_uid=ProjectTicketUser'
				.'&x_pwd_md5=d3f02ffc01679ede7402e92af14d3abb&x_ac=10&x_target_no='
				.$sPhoneNum.'&x_memo='.$sContent.'&x_gate_id=300';
				
		if(function_exists('file_get_contents'))
		{
			//如果存在file_get_contents函数，则直接通过该函数发送，并获取返回信息
			$oContext = stream_context_create(
					array('http' => array('timeout' => 5))
					);
					
			$sFileContents = file_get_contents($sUrl, 0, $oContext);
		}
		else
		{
			//否则通过Curl进行访问，并获取返回信息
			$oCurl = curl_init();
			$iTimeout = 5;
			curl_setopt($oCurl, CURLOPT_URL, $sUrl);
			curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($oCurl, CURLOPT_CONNECTTIMEOUT, $iTimeout);
			$sFileContents = curl_exec($oCurl);
			curl_close($oCurl);
		}
		return $sFileContents;
	}
	
	/**
	 * 获取微秒
	 * @return mixed
	 */
	protected function getMicrosecond(){
		return microtime(true);
	}
}
?>